SPSS日期计算快速教程
作者:Ruben Geert van den Berg,发表于SPSS Date & Time Variables
引言与练习数据文件
SPSS 中的日期计算非常直接。 只需要确保你理解一些基础知识,并保持操作的简洁明了。本教程将向你展示如何做到这一点。我们将使用 hospital.sav(如下所示)作为示例。
SPSS主要日期函数
下表展示了 SPSS 的主要日期函数。 我们将在下面的几个示例中展示如何使用它们。
函数 | 用途 | 示例 | 返回值 |
---|---|---|---|
DATEDIFF | 计算两个日期之间以给定时间单位(例如天数、月数、年数)表示的差值 | datediff(date1,date2,'days') |
标准数值 |
DATESUM | 将指定的时间单位(例如天数、月数、年数)加到日期变量上(或减去,如果值为负数) | datesum(date,10,'days') |
日期值 |
XDATE | 从日期变量中提取日期组成部分(例如年、月、日) | xdate.month(date) |
标准数值 |
DATE.DMY | 从日、月、年创建日期值 | date.dmy(19,3,2015) |
日期值 |
SPSS DATEDIFF 函数
SPSS DATEDIFF
函数返回两个日期值之间的时间单位数(例如小时、天或年)。 例如,我们的受访者是多久前入院的? 我们将通过从当前日期中减去 entry_date
(入院日期)来回答这个问题。 下面的语法就可以做到这一点。
***1. 在数据中创建当前日期作为新变量。**
compute today = $time.
execute.
***2. 以日期格式显示当前日期。**
formats today(edate10).
***3. 计算天数差。**
compute days_ago = datediff(today,entry_date,'days').
execute.
***4. 不显示任何小数位。**
formats days_ago(f4).
结果
就这么简单。 只需要记住一件事,DATEDIFF
函数会截断(向下舍入)其结果值。 因此,如果选择年作为时间单位,2 年 363 天将返回为 2 年 0 天。 如果你不希望这样,请提取两个日期之间的_天数_,然后像我们在 如何在 SPSS 中计算年龄? 中所做的那样,将其除以 365.25。
SPSS DATESUM 函数
SPSS DATESUM
函数将时间单位数添加到日期变量。 对于_减去_时间,只需输入一个负值。
假设我想在受访者入院 3 个月后联系他们。 但是,在联系他们之前的 7 天,应该向他们发送通知。 以下语法显示了如何将这两个日期添加到我们的数据中。
***1. 将 3 个月添加到 entry_date 以计算 contact_date(联系日期)。**
compute contact_date = datesum(entry_date,3,'months').
execute.
***2. 将时间值显示为日期。**
formats contact_date(date11).
***3. 从 contact_date 中减去 7 天作为 notify_date(通知日期)。**
compute notify_date = datesum(contact_date,-7,'days').
execute.
***4. 将时间值显示为日期。**
formats notify_date(date11).
结果
SPSS XDATE 函数
SPSS XDATE
函数从日期中提取日期组成部分(例如小时、天或年)。 例如,以下语法首先从 entry_date
(入院日期) 中提取年份,然后提取月份。
***1. 从日期中提取年份。**
compute year = xdate.year(entry_date).
execute.
***2. 从日期中提取月份。**
compute month = xdate.month(entry_date).
execute.
***3. 隐藏小数。**
formats year month(f4).
***4. 将值标签应用于月份。**
value labels month 1 'January' 2 'February' 3 'March' 4 'April' 5 'May' 6
'June' 7 'July' 8 'August' 9 'September' 10 'October' 11 'November' 12
'December'.
结果
同样,就这么简单。 但是,一个重要的警告是,正如SPSS 计算错误的周数? 中所讨论的,XDATE.WEEK
返回无意义的周数。 不幸的是,没有简单的方法来提取你可能想要的 ISO 周数。 我们为此构建了一个 SPSS-Python 工具,但它在 SPSS 24 版左右停止工作了。
另一件需要记住的事情是,没有 XDATE.DAY
这样的东西。 而是使用:
- XDATE.MDAY 表示月份中的日期(1 到 31);
- XDATE.WKDAY 表示星期几(1 到 7,其中 1 是星期日,而不是星期一);
- XDATE.JDAY 表示一年中的日期(1 到 366)。
SPSS DATE.DMY 函数
SPSS DATE.DMY
函数从其组成部分(例如日、月和年)创建日期。 假设我想知道在 2015 年 1 月 20 日之前有多少天患者入院。 我将创建一个新的日期变量(或者更确切地说,常量)来保存此日期,并从 entry_date
中减去它。
***1. 将 start_date(开始日期)作为 2015 年 1 月 20 日添加到数据作为新变量。**
compute start_date = date.dmy(20,1,2015).
execute.
***2. 将 start_date 显示为日期。**
formats start_date (date11).
***3. 计算数据分析开始前经过的天数。**
compute days_passed = datediff(start_date,entry_date,'days').
execute.
结果
显然,DMY
表示“日、月、年”,因此这是我们输入这些日期组成部分的顺序。 现在,在第一个实例中,DATE.DMY
导致变量保存很大的数字。 这些是 1582 年到我的实际数据之间的秒数,如 SPSS 日期变量基础 中所述。 通过设置适当的格式,可以将这些大数字显示为普通日期。 例如,FORMATS today (DATE11).
将日期显示为 “3-Sep-2018”。 我们建议这样做,因为它可以明确地说明这是哪个日期。 请避免显示像 “01-02-03” 这样的日期,因为这可能意味着:
- 如果其格式为
EDATE8
(欧洲日期),则为 2003 年 2 月 1 日; - 如果其格式为
ADATE8
(美国日期),则为 2003 年 1 月 2 日; - 如果其格式为
SDATE8
(可排序日期),则为 2001 年 2 月 3 日。
SPSS 日期比较
当我们比较两个数字时,我们可以简单地询问一个数字是否大于另一个数字。 完全相同、简单的逻辑适用于日期比较。 但是,有一个注意事项:尽管我们看到的是“普通日期”,但在日期比较中使用的是底层值(自 1582 年以来的秒数)。 这听起来可能令人生畏,但解决方案很简单:如果我们想将 SPSS 日期值与某个比较日期进行比较,我们只需将比较日期转换为实际的 SPSS 日期。 我们刚刚看到了如何轻松地做到这一点:将日期组成部分填入 DATE.DMY
。 我们将通过一些示例来演示这一点。 假设医院在 2014 年 2 月 20 日迎来了一位新任 CEO。 我们想知道在此日期之前的访问与在此日期之后的访问是否被评为相同。 我们现在将选择 2014 年 2 月 20 日及之后的访问。
SPSS 日期比较示例 I
***1. 计算 new_ceo 变量(全部为零)。**
compute ceo = 0.
***2. 如果入院日期至少为 2014 年 2 月 20 日,则在新任 CEO 期间入院。**
if (entry_date >= date.dmy(20,2,2014)) ceo = 1.
execute.
***3. 隐藏不必要的小数。**
formats ceo(f1).
***4. 将值标签添加到新变量。**
value labels ceo 0 'entry_date during old CEO' 1 'entry_date during new CEO'.
结果
标记 2014 年 2 月 20 日或之后开始的访问。
SPSS 日期比较语法示例 II
2014 年的暑假从 2014 年 6 月 30 日到 2014 年 8 月 24 日。 我们如何选择这些假期期间的访问? 以下语法显示了如何通过在 RANGE 中使用 DATE.DMY
来轻松地做到这一点。
***1. 计算 holiday 变量,仅保存零。**
compute holidays_2014 = 0.
***2. 如果访问在 2014 年假期期间开始,则将 0 更改为 1。**
if (range(entry_date,date.dmy(30,6,2014),date.dmy(24,8,2014))) holidays_2014 = 1.
execute.
***3. 隐藏小数。**
formats holidays_2014(f1).
这就是 SPSS 中主要日期计算的基本内容。 我们可以提出数百万个示例,但你可能会很容易地自己解决它们。 我们希望如此。